﻿using System;
using Lucas.Wendell.PI.Infrastructure.NinjectSLC;
using Lucas.Wendell.PI.Interface;
using Lucas.Wendell.PI.Model;
using Lucas.Wendell.PI.Model.Utils;
using Senac.NetMob.Models;

namespace Lucas.Wendell.PI.Service
{
    public class UsuarioService : BaseService
    {
        private readonly IUsuarioRepository _repo;

        public UsuarioService()
        {
            _repo = Kernel.GetInstance<IUsuarioRepository>(typeof (IUsuarioRepository));
        }
        
        #region Métodos herdados da BaseService

        protected override bool Insert(BaseModel model)
        {
            Usuario user = (Usuario)model;

            user.Senha = UtilsMethods.GetMd5(user.Senha);

            return _repo.Save(user);
        }

        protected override bool Update(BaseModel model)
        {
            Usuario user = (Usuario)model;
            Usuario _user = new UsuarioService().GetById(user.Id);

            if (!string.IsNullOrEmpty(user.Senha) && !user.Senha.Equals(_user.Senha))
                user.Senha = UtilsMethods.GetMd5(user.Senha);

            return _repo.Save(user);
        }

        public override bool Delete(BaseModel model)
        {
            model.Ativo = false;

            try
            {
                return _repo.Save((Usuario)model);
            }
            catch (NetImobiliariaException)
            {
                throw;
            }
            catch (Exception)
            {
                throw;
            }
        }

        protected override void Validate(BaseModel model)
        {
            //Usuario user = (Usuario)model;
            //Usuario _user = _repo.GetByLogin(user.Login);

            //if (user.Nome == null || user.Nome.Equals(""))
            //    throw new NetImobiliariaException(NetImobiliariaExceptionTypes.UsuarioCampoNomeObrigatorio, UtilsMethods.CampoObrigatorio("Nome"));

            //if (user.Nome.Length > 50)
            //    throw new NetImobiliariaException(NetImobiliariaExceptionTypes.MaximoCaracteres, UtilsMethods.MaximoCaracteres("Nome", 50));

            //if (string.IsNullOrEmpty(user.Login))
            //    throw new NetImobiliariaException(NetImobiliariaExceptionTypes.UsuarioCampoLoginObrigatorio);

            //if (user.Login.Length > 20)
            //    throw new NetImobiliariaException(NetImobiliariaExceptionTypes.MaximoCaracteres, UtilsMethods.MaximoCaracteres("Login", 20));

            //if (_user != null && _user.Codigo != model.Codigo)
            //    throw new NetImobiliariaException(NetImobiliariaExceptionTypes.UsuarioJaRegistrado, "Já existe usuário com esse login.");

            //if (string.IsNullOrEmpty(user.Senha))
            //    throw new NetImobiliariaException(NetImobiliariaExceptionTypes.UsuarioCampoSenhaObrigatorio, UtilsMethods.CampoObrigatorio("Senha"));

            //if (user.Senha.Length < 6)
            //    throw new NetImobiliariaException(NetImobiliariaExceptionTypes.UsuarioCampoSenhaMinimoCaracteres, "Campo Senha deve possuir no mínimo 6 caracteres.");

            //if (user.ConfirmaSenha != user.Senha)
            //    throw new NetImobiliariaException(NetImobiliariaExceptionTypes.UsuarioConfirmarSenhaDiferente, "Campo Confirmar Senha não confere com a Senha.");
        }

        #endregion

        #region Métodos Públicos
        
        public Usuario GetById(int id)
        {
            return _repo.GetById(id);
        }

        public Usuario GetByLogin(string login)
        {
            return _repo.GetByLogin(login);
        }

        public Usuario GetByLoginAndSenha(Usuario user)
        {
            user.Senha = UtilsMethods.GetMd5(user.Senha);
            return _repo.GetByLoginAndSenha(user.Login, user.Senha);
        }

        #endregion
    }
}
